____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
ÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻ
APL (Programmiersprache)
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
top
APL (A Programming Language) ist eine Ăźblicherweise interpretierte Programmiersprache, deren Syntax Ăźberwiegend aus Symbolen besteht. Sie wurde von Kenneth E. Iverson und seinen Kollegencite-ref-1[1] bei IBM in den 1960er Jahren als algorithmische Notation (u. a. fĂźr den Mathematikunterricht)cite-ref-2[2] und als Entwurfssprache fĂźr GroĂrechner entwickelt.
Contents
⢠Geschichte
⢠Besonderheiten
⢠Interaktivität
⢠Programmcode
⢠Datentypen
⢠Variablen
⢠J und APL
⢠Einzelnachweise
⢠Literatur
⢠Weblinks
⢠Periodika
⢠Ăber APL
⢠Syntax
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Geschichte
Mit dem Buch A Programming Language aus dem Jahr 1962 gab Kenneth Iverson den AnstoĂ zur Verwendung eines neuen Konzepts in der Programmierung. Bevor der erste Interpreter verfĂźgbar war, diente APL bereits als Metasprache fĂźr die Beschreibung der Architektur des damals neu entwickelten Computersystems IBM System/360 aus der Sicht des Programmierers.cite-ref-3[3] Ab 1965 wurde APL als Programmiersprache auf GroĂrechnern (z. B. IBM System/360) implementiert und den Kunden als Timesharing-Option angeboten. Zu jener Zeit wurden IBM-Kugelkopf-Schreibmaschinen als âTerminalâ verwendet. Daher hatte der ursprĂźngliche Zeichensatz nur (kursive) GroĂbuchstaben.cite-ref-4[4]
Ab 1975 gab es eine Implementierung auf der IBM 5100, einem Vorläufer des PC, der bereits ein Mikrocomputer war. Obwohl die Maschine nach damaligen MaĂstäben als durchaus leistungsfähig galt, lief APL auf ihr verhältnismäĂig langsam, da es sich um eine Emulation des Mainframe-APL-Interpreters handelte.
Die ersten Implementierungen auf PCs benÜtigten ein Spezial-EPROM, damit der APL-Zeichensatz angezeigt werden konnte. Der APL-Zeichensatz wurde ursprßnglich so gewählt, dass die Symbole mÜglichst selbsterklärend sind, dass sich also die Funktionen aus den Symbolen intuitiv herleiten lassen. Seit einigen Jahren wird der Begriff APL auch als Array Processing Language interpretiert.
Besonderheiten
Operatoren und spezielle Zeichen
APL verwendet spezielle Operatoren, bzw. Befehle, die jeweils die Funktion haben, nicht nur einzelne Zahlen-Werte zu bearbeiten, sondern bei Bedarf ganze Vektoren und Matrizen, z. B. 2 Matrizen zu addieren oder das Skalar-Produkt von 2 Vektoren zu berechnen. FĂźr jeden dieser Operatoren gab es ein spezielles Zeichen, wodurch insgesamt ein erweiterter Zeichensatz benĂśtigt wurde und zwar sowohl auf der Tastatur, im Speicher und auf dem Bildschirm â seitdem es solche gab â wie auch auf dem Drucker. Es gab damals noch keine Laser- oder Inkjet-Drucker, die man programmieren kann, quasi jedes beliebige Zeichen zu generieren. Die Verwendung solcher Zeichen mit der Funktion von Operatoren ermĂśglichte zwar einen extrem knappen, aber fĂźr AuĂenstehende auch kryptischen Code, der viele Leute abschreckte und nicht zwingend war. Man hätte auch reservierte Worte als Operatoren verwenden kĂśnnen. Inzwischen findet man solche Zeichen im Unicodeblock Verschiedene technische Zeichen.
Interaktivität
APL war von Anfang an interaktiv: Nach der Eingabe eines Befehls (z. B. einer Rechenanweisung 1234 â 777) drĂźckt man die Entertaste, der Befehl wird vom Interpreter ausgefĂźhrt und das Ergebnis angezeigt. Eine spezielle Anweisung fĂźr die Ausgabe des Ergebnisses, wie z. B. der PRINT-Befehl in BASIC, ist nicht nĂśtig, existiert aber fĂźr den Fall, dass ein Ergebnis angezeigt werden soll, das normalerweise nicht angezeigt wĂźrde (z. B., wenn einer Variablen ein Wert zugewiesen wird).
Tritt ein Fehler auf, erhält man eine entsprechende Meldung. Man kann seine Eingabe modifizieren und erneut ausfĂźhren. Die dadurch mĂśgliche direkte Interaktion mit dem Computer ist bis heute einer der groĂen Vorteile von APL als Entwicklungswerkzeug.
Aus heutiger Sicht klingt dies trivial, aber APL war eine der ersten Programmiersprachen, die diesen Luxus bot: Konkurrierende Sprachen waren noch nicht interaktiv, sondern mussten vor der AusfĂźhrung eines Programms jeweils kompiliert werden.
Programmcode
Folgen von Befehlen lassen sich zu Funktionen zusammenfassen. Funktionen kÜnnen wiederum andere Funktionen aufrufen. In der Tat ist APL eine der ersten funktionalen Programmiersprachen. Näheres und ein Beispiel siehe unten.
Bis in die 1990er Jahre fehlten APL die Kontrollstrukturen der âStrukturierten Programmierungâ. Logik musste durch Sprunganweisungen realisiert werden. In APL werden Kontrollstrukturen seltener als in anderen imperativen Programmiersprachen verwendet, einerseits weil APL-Funktionen nicht nur Skalare, sondern Datenstrukturen beliebiger Dimension verarbeiten, andererseits, weil es den Operator Each bietet.
Datentypen
APL kennt mindestens die Datentypen Char, Bool, Int und Float, allerdings muss der Programmierer dies nicht berĂźcksichtigen, denn der Interpreter wandelt die Datentypen automatisch um, wann immer dies notwendig ist. Dies bedeutet auch, dass APL keine TypprĂźfung kennt.
Der Datentyp von Variablen muss nicht eigens deklariert werden, man kann einer Variablen eine Gleitkommazahl zuweisen (oder einen Vektor oder eine Matrix von Gleitkommazahlen) und danach einen Text, ohne dass es zuvor einer besonderen Anweisung bedarf.
Speicherverwaltung
Auch die Speicherverwaltung wird vom Interpreter ßbernommen. Ein APL-Programmierer muss sich während des Programmablaufs weder um das Reservieren noch um das Freigeben von Speicher kßmmern. Der Arbeitsspeicher wird im sogenannten Workspace fßr Variablen und Programme insgesamt zur Verfßgung gestellt, er kann beim Programmstart festgelegt und in manchen APL-Produkten auch dynamisch erweitert werden.
Array-Verarbeitung
Fast alle Funktionen in APL sind auch nicht-skalar ausgelegt. Dies bedeutet, dass Funktionen nicht nur auf einzelne Skalare (Zahlen oder Characters), sondern auch auf Vektoren (Zahlenreihen), Matrizen (Tabellen) und mehrdimensional angeordnete Daten (Arrays) sowie auf Listen angewendet werden kĂśnnen.
Beispiele (die eingerĂźckte erste Zeile ist die Benutzereingabe, die zweite Zeile die Antwort des APL-Interpreters)
Viele Programmiersprachen erlauben die Addition zweier Skalare:
2 + 3
5
APL gestattet aber auch die Addition Vektor und Skalar:
2 3 4 + 3
5 6 7
und die Addition zweier Vektoren:
2 3 4 + 5 6 7
7 9 11
AusfĂźhrung und Rangfolge
Es gibt in APL nur eine einzige Rangfolgenregel: Alles wird von rechts nach links abgearbeitet. Ausnahme: AusdrĂźcke in Klammern werden zuerst abgearbeitet. Daher gilt:
10Ă2+3
50
aber:
(10Ă2)+3
23
Variablen
In APL mĂźssen Variablen nicht deklariert oder typisiert werden (siehe Datentypen). Eine Variable wird erzeugt, indem man einen Namen, gefolgt von einem Zuweisungspfeil (â), gefolgt vom Wert bzw. den Werten der Variablen eingibt:
XWERTâ456.78
YVECTâ56 23 81.8 796 0.014 8.9 20 1
TEXT1â'Dies ist ein Text'
MATRIXâ2 4ĎYVECT
(der Operator Ď, genannt rho, verwandelt den 8-gliedrigen Vektor YVECT in eine Matrix mit 2 Zeilen und 4 Spalten. So lassen sich auch Arrays mit mehr Dimensionen bilden.)
Das Konzept der Konstanten, also unveränderbar deklarierter Werte, gibt es in APL nicht, es kann aber simuliert werden durch eine Funktion, die keine Argumente benÜtigt und ein explizites Ergebnis zurßckliefert.
Geltungsbereich
Jede Zuweisung erzeugt eine globale Variable, d. h. die Variable ist im gesamten Programm sicht- und änderbar. Man kann den Geltungsbereich von Variablen aber einschränken, indem man den Namen der Variablen in die Kopfzeile einer Funktion aufnimmt. Eine solche Variable wird als lokal bezeichnet, da sie nur zur Laufzeit der Funktion sichtbar ist.
Wenn allerdings eine Funktion F1 eine lokale Variable A definiert und anschlieĂend eine Funktion F2 aufruft, dann ist A innerhalb von F2 sicht- und änderbar, was heute als Designmakel gilt. Die Direct Functions in Dyalog APL verhalten sich allerdings anders: Dort sind lokale Variablen tatsächlich im engeren Sinne lokal und auch in aufgerufenen Funktionen unsichtbar.
Arrays
Daten jeder Art werden in APL Arrays genannt. Arrays kĂśnnen unterschiedliche Dimensionen haben. Ein einzelner Wert wird Skalar genannt. Mehrere Werte nebeneinander bilden einen Vektor. Der Operator zur Verkettung (Konkatenieren) mehrerer Skalare ist das Komma. Dabei ist es auch mĂśglich, einen einzelnen Wert mit einer Leeren Menge zu verketten und so einen Vektor zu erhalten, der aus einem einzigen Element besteht. Auch leere Vektoren sind erlaubt: Das sind Vektoren, die Ăźberhaupt kein Datenelement enthalten, sondern nur die Strukturinformation.
Die Dimension eines Arrays wird in APL mit dem griechischen Buchstaben Ď (Rho) angegeben. Wenn von dem âRankâ eines Arrays die Rede ist, meint man die Anzahl der Dimensionen des Arrays, also Rho von Rho. Demzufolge ist der Rank eines Skalars 0, der eines Vektors 1, der einer Tabelle 2, und so weiter.
Die Ebenen eines dreidimensional angeordneten Arrays heiĂen Planes. Es sind Arrays mit n Dimensionen mĂśglich, die Anzahl ist nur begrenzt durch die maximale GrĂśĂe der Integer-Indizierung (231-1) und den zur VerfĂźgung stehenden Speicherplatz.
Im Jahre 1986 brachte IBM ein erheblich erweitertes APL mit dem Namen APL2 auf den Markt. Die Erweiterung bestand hauptsächlich darin, dass jedes Element eines Arrays aus beliebigen anderen Datenstrukturen bestehen kann (Nested Array). Damit ergeben sich verschachtelte Strukturen. Zur Veranschaulichung befindet sich rechts ein Beispiel. Es handelt sich dabei um eine bereits behandelte, numerische Matrix mit 4 Zeilen und 5 Spalten. Jedoch besteht das 2. Element der 2. Zeile aus einem Textvektor und das 4. Element der 3. Zeile aus einer 2x2-Matrix. Es lassen sich somit auch die Textlabels mit den numerischen Werten zu einer Tabelle verknßpfen. APL2 erÜffnete die MÜglichkeit, auch mixed arrays sowie einfache und komplexe Listen zu erzeugen.
Im Zuge dieser Erweiterung wurden auch neue sogenannte âprimitive Funktionenâ (primitive functions) zur Bearbeitung der neuen Datenstrukturen eingefĂźhrt sowie die alten Funktionen angepasst und in ihrem Geltungsbereich erweitert. Andere APL-Hersteller brachten ähnliche Erweiterungen ihrer Implementierungen heraus, wobei feine Unterschiede die Portierung eines Programms zu einer anderen Implementierung erschweren. Heute gilt die APL2-Implementation als Referenz fĂźr alle Hersteller, man bemĂźht sich um grĂśĂtmĂśgliche Kompatibilität.
Funktionen und Operatoren
APL kennt sowohl Funktionen als auch Operatoren, aber die Bedeutung der Begriffe ist anders als in der Mathematik: Funktionen werden auf Daten angewendet, Operatoren auf Funktionen und Daten. Funktionen liefern Daten zurĂźck, Operatoren sogenannte âabgeleitete Funktionenâ (engl.: derived function).
Beispiel
Das Zeichen slash (/) steht fĂźr den Operator reduce. Operatoren erwarten einen oder zwei Operanden. Wird nur ein Operand verwendet, dann muss er links neben dem Operator stehen:
+/
In diesem Beispiel ist der Operand die Funktion âPlusâ. Zusammen mit dem Operator wird die abgeleitete Funktion Summiere gebildet.
Angewendet auf einen Vektor:
+/ 3 4 5
bewirkt der Operator Reduce, dass der Operand zwischen die einzelnen Bestandteile des Vektors eingefĂźgt wird. Abstrakt ausgedrĂźckt:
f/ n1 n2 n3 == n1 f n2 f n3
und im konkreten Beispiel (das Ergebnis steht darunter):
+/ 3 4 5 == 3 + 4 + 5
12
Wie mächtig dieses Konzept ist, wird aber erst bei Betrachtung eines anderen Operators klar: Expand (backslash, \) verwendet den Operanden in der gleichen Weise wie Reduce, erzeugt aber Zwischenergebnisse und reduziert den Rang des Ergebnisses nicht (Reduce verwandelt einen Vektor in ein Skalar, eine Matrix in einen Vektor und so weiter â dies verringert die Notwendigkeit von Programmschleifen):
+\ 3 4 5
3 7 12
Weitere Beispiele
Ă/ 3 4 5
60
Ă\3 4 5
3 12 60
-/3 4 5
4
-\3 4 5
3 -1 4
Es gibt auch Operatoren, die zwei Operanden verlangen. Der Operator Outer Product (.) ist ein solcher Operator. Verwendet man als Operanden die Funktionen Plus (+) und Mal (Ă), dann entsteht in APL die Matrizenmultiplikation:
1 2 3 +.Ă 40 50 60
320
Das funktioniert genauso mit Matrizen. Um dies zu demonstrieren, sind in dem Bild einige Zeilen aus einer APL-IDE (hier Dyalog APL/W) dargestellt. Es werden neben + und Ă drei APL-Funktionen verwendet:
⢠Der nach links weisende Pfeil symbolisiert in APL die Zuweisung eines Wertes auf einen Variablennamen.
⢠Das einem i ähnelnde Zeichen Κ (Iota) steht fßr die Funktion Indexvektor bilden. Im ersten Anwendungsfall wird eine Zahlenkette von 1 bis 6 erzeugt.
⢠Das dem Buchstaben p ähnelnde Zeichen Ď (rho) steht fĂźr die APL-Funktion shape und formatiert die rechts angegebenen Daten. Die Anzahl der Achsen wird links von dem Zeichen angegeben. Im ersten Anwendungsfall wird eine Matrix mit zwei Zeilen und drei Spalten erzeugt.
⢠Die Formel â+.Ăâ symbolisiert das Matrizenprodukt.
Selbstdefinierte Funktionen
Zusätzlich zu den eingebauten Funktionen (primitive functions) kann man seine eigenen Funktionen schreiben, die dann selbstdefinierte Funktion (user-defined function) genannt werden. Eine solche Funktion kann null, ein oder zwei Argumente verlangen und heiĂt entsprechend âniladischeâ, âmonadischeâ oder âdyadischeâ Funktion. Gemäà ihrer Abstammung von der mathematischen Notation erwarten monadische APL-Funktionen ihr Argument rechts und dyadische Funktionen rechts und links.
Die Funktion kann einen Wert zurĂźckliefern.
Beispiel fĂźr eine dyadische Funktion:
R â S Runde Z
Dabei sei âSâ die Zahl der Dezimalstellen, auf die das Argument âZâ (eine reelle Zahl) zu runden ist; das Ergebnis steht in R. Anwendung:
2 Runde 3.14159265
3.14
Funktionen kĂśnnen sich Ăźber mehrere Zeilen erstrecken. In Funktionen kĂśnnen andere Funktionen aufgerufen werden. Verzweigungen erfolgten ursprĂźnglich mittels (evtl. bedingten) Sprungbefehlen und Zielmarken (labels). Heute wird diese Technik kaum noch verwendet: AuĂer APL2 bieten alle modernen Implementationen Kontrollstrukturen.
Programmbeispiel zur Illustration der Wirkungsweise von APL
R â {S} Runde Z
[1] â Runde eine reelle Zahl Z auf S Stellen
[2] â Standardwert fĂźr S ist 2, wenn der Wert beim Aufruf nicht spezifiziert wurde
[3] â(0â âNC'S')/RN
[4] Sâ2
[5] RN: Râ(10*-S)Ăâ0.5+ZĂ10*S
Diese Funktion und ihre Anwendung sollen die Eigenschaften von APL erläutern:
Erläuterung des Programmbeispiels
⢠Zeile 0: Definition der Funktion mit zwei Argumenten S (âStellenâ) und Z (âZahlâ) und einem expliziten Ergebnis R. Die geschweiften Klammern um das Argument S machen dieses zu einem optionalen Argument.
⢠Zeilen 1 und 2: Kommentarzeilen (erkennbar an der âLampeâ â als erstem Zeichen).
⢠Zeile 3: Mit einer Bedingung wird geprĂźft, ob die NameClass (âeingebaute Funktionâ âNC) des Namens S ungleich 0 ist. 0 bedeutet ânicht definiertâ. Die Verzweigung zur Marke RN gilt, wenn die Bedingung in Klammern = 1 ist, andernfalls wird RN (das einfach nur die Zeilennummer 5 ist), durch die normale APL-Anweisung 0/RN auf den âleeren Vektorâ reduziert (â/â ist der Operator reduce) und es erfolgt keine Verzweigung.
⢠Zeile 4: Wenn die Bedingung in Zeile 3 nicht erfßllt ist (= Wert ist unbekannt), wird S auf 2 gesetzt.
⢠Zeile 5: Hier findet die eigentliche Rundung statt. Kennzeichnend ist das âWeiterreichenâ errechneter Werte von rechts nach links, z. B. die Multiplikation des Parameters Z mit den Rundungsstellen S (ZĂ10*S). Der dadurch erzeugte um S Zehnerpotenzen grĂśĂere Wert wird anschlieĂend (also links davon) kaufmännisch (Addition von 0.5) gerundet (â-Funktion, genannt âfloorâ) und somit von weiteren Dezimalstellen befreit, so dass er nun ein ganzzahliger Wert ist. Das Ergebnis wird in die links stehende Multiplikation mit (10*-S) weitergereicht, die den Wert wieder um S Zehnerpotenzen verringert. Dies ist das Ergebnis R der Funktion.
Wirkungsweise bzw. Anwendung
Beispiele:
1 Runde 3.14159265
3.1
Runde 3.14159265
3.14
3 Runde 3.14159265 77.123 99.9
3.142 77.123 99.900
Runde 2 2 Ď(Κ4)á7
0.14 0.29
0.43 0.57
⢠Erstes Beispiel: Anwendung der Funktion auf Pi, Rundung auf 1 Stelle (siehe auch weiter oben).
⢠Zweites Beispiel: Rundung von Pi auf zwei Stellen, Test des Default-Wertes (linkes Argument fehlt).
⢠Drittes Beispiel: Rundung eines Vektors auf drei Stellen (rechts fehlende Nullen werden ergänzt).
⢠Viertes Beispiel: Rundung einer Matrix (Tabelle) auf zwei Stellen (Default) â zwei Zeilen und zwei Spalten erzeugt durch die Funktion Ď aus der Division der ersten vier natĂźrlichen Zahlen (Κ4, Funktion iota) durch 7.
Die Funktion Runde kann nicht nur wie oben gezeigt interaktiv ausgefĂźhrt werden, sie kann auch in anderen Programmen verwendet werden:
X â 4 Runde +/MAT
Dabei sei MAT eine Tabelle mit beliebigen Zahlen, die durch die âSummenreduktionâ (+/) spaltenweise summiert wird. Die entstehenden n-stelligen Zahlen (ein Vektor) werden auf 4 Dezimalen gerundet der Variablen X zugewiesen. Stattdessen kĂśnnte man auch damit weiterrechnen, sie beispielsweise mit 2 multiplizieren:
2 Ă 4 Runde +/MAT
âModerneâ Sprachkonzepte: Rekursion und Kontrollstrukturen
Beispiel (ohne Zeilennummern) unter Verwendung âmodernerâ (in anderen APL-âDialektenâ später eingefĂźgter) Kontrollstrukturen:
Z â FAKULTĂT N
â Da n! = n Ă (n-1)!, muss (am Anfang) die Rekursion
â bei n=1 "gestoppt" werden (1! = 1)
:If N <= 1
Zâ1
:Else
ZâNĂFAKULTĂT N-1
:EndIf
Anm.: Wegen der Verarbeitungsreihenfolge muss ân-1â nicht in Klammern stehen (kann aber).
Mächtigkeit und Lesbarkeit
APL ist mächtig: Es gibt (abhängig von der Version) rund 70 primitive, das heiĂt im Interpreter verankerte (im Gegensatz zu selbst definierten) Funktionen. Diese werden durch etwa 50 Symbole dargestellt, von denen rund 20 Symbole zwei verschiedene Funktionen repräsentieren, in Abhängigkeit davon, ob sie mit einem oder zwei Argumenten aufgerufen werden.
Beispiel:
⢠In 8 á 4 wird die Funktion âáâ dyadisch als Division verwendet. Das Ergebnis ist 2.
⢠In á.25 wird die Funktion âáâ monadisch verwendet; sie liefert den Kehrwert des rechten Arguments. Das Ergebnis ist 4.
Die meisten der in APL âeingebautenâ Funktionen wirken sowohl auf Skalare als auch auf Vektoren, Matrizen und hĂśherdimensionale Arrays. Wo in anderen Programmiersprachen Schleifen verwendet werden mĂźssen, um eine Menge von Werten zu verarbeiten, genĂźgt in der Regel bei APL der Einsatz einer primitiven Funktion. DarĂźber hinaus kĂśnnen viele dieser Funktionen mittels Operatoren erweitert werden.
Neben den primitiven Funktionen, die immer aus einem einzelnen Zeichen bestehen, gibt es eine groĂe Anzahl von System-Funktionen und -Variablen. Datum und Uhrzeit sind z. B. in einer Systemvariablen âTS (fĂźr TimeStamp) abfragbar. Systemvariablen gehĂśren nicht zum âprimitivenâ Sprachumfang, sondern sind abhängig von der Implementation. Auch Systemfunktionen sind teilweise implementationsabhängig. Sie stellen beispielsweise Schnittstellen zu anderen Programmiersprachen und zum Betriebssystem bereit.
Definierte Funktionen passen sich nahtlos in dieses Konzept ein. Sie kĂśnnen monadisch oder dyadisch sein und ohne spezielle Syntax mit den primitiven Funktionen zusammen in einem Statement verwendet werden. Es kĂśnnen sogar selbst programmierte Funktionen als Argumente eines Operators verwendet werden oder Operatoren selbst programmiert werden.
Da die primitiven Funktionen von APL nur aus einem einzigen Zeichen bestehen und diese Funktionen zudem sehr mächtig sind, kann keine andere Sprache mit vergleichbarer Kßrze und Stringenz aufwarten. Wo in anderen Programmiersprachen viele Zeilen vonnÜten sind, reicht bei APL häufig schon eine Anweisung mit einigen Symbolen aus.cite-ref-5[5]
Dies sind die berĂźhmt-berĂźchtigten âone-linersâ, an denen viele APL-Programmierer ihr âDenkzeugâ (âAPL as a tool of thoughtâ) geschärft haben. Ken Iverson selbst hat einen one-liner geschaffen, der eine Liste der ersten Primzahlen bis hĂśchstens N erstellt:cite-ref-6[6]
(2 = 0 +.= T â.| T) / T â ΚN
Es existieren noch extremere Beispiele. So gibt es eine APL-LĂśsung des n-Damen-Problems ebenfalls in einer (!) Zeile. Kritiker sprechen von APL gelegentlich als von einer âWrite-once-read-neverâ-Sprache. Diesem Urteil liegt ein Missverständnis zugrunde: Wenn in einer Zeile APL soviel passiert wie in zwei Seiten C-Code, dann sollte man realistischerweise davon ausgehen, dass diese eine Zeile zum Verständnis etwa die gleiche Zeit benĂśtigt wie die zwei Seiten C-Code.
APL hat sich besonders in Bereichen bewährt, in denen sich die Anforderungen konstant und schnell ändern: Versicherungen, Hedge-Fonds, Portfolio-Verwalter sowie Prototyping fßr neue Anwendungen.
Die verwendeten Symbole, die KĂźrze der Formulierung und die variable Manipulation abstrakter Objekte (die erwähnten Skalare, Vektoren, Matrizen und so weiter â sowohl in Zahlen- wie in Textform und sogar gemischt) machen APL zu einer Sprache fĂźr Mathematiker (wofĂźr sie ja auch anfangs konzipiert war). Sie erfordert abstraktes Denken und räumliches VorstellungsvermĂśgen, ist dadurch aber auch einfach und sehr elegant.
AusfĂźhrungsgeschwindigkeit
Da APL interpretiert wird, kann es vergleichsweise langsam in der AusfĂźhrung sein. Dies macht sich besonders dann unangenehm bemerkbar, wenn ein APL-Programm sich um einzelne Datenteilchen kĂźmmern muss, zum Beispiel in einem KeyPress-Event-Handler. Andererseits umfasst APL einen groĂen Vorrat hochspezialisierter Funktionen, die fĂźr die Verarbeitung groĂer Arrays optimiert sind. Werden diese Funktionen auf groĂe Datenmengen angewendet, dann kĂśnnen APL-Programme wie auch andere Interpreter-Programme sehr schnell sein.
Als funktionale Sprache ist APL prinzipiell geeignet, Multiprozessormaschinen auszunutzen. In diesem Bereich gibt es derzeit die grĂśĂten Weiterentwicklungen der am Markt erfolgreichen APL-Implementationen.
Entwicklung und aktuelle Situation
Die Zeitschrift APL Quote-Quad stellte das erste schriftliche Kommunikationsmittel fĂźr APL-Anwender auĂerhalb von IBM dar, und dieses hausgemachte Mitteilungsblatt war definitiv ein Keimzelle fĂźr die Organisation von APL-Anwendern unter der Ăgide der Association for Computing Machinery (ACM).cite-ref-7[7]
Bis etwa 1985 war IBM mit ihrem APL2-Interpreter auf PCs wie auf Mainframes der fßhrende Anbieter. In den folgenden knapp 10 Jahren war APL sehr erfolgreich, wurde aber nicht nennenswert weiterentwickelt. Erst seit etwa 1992 haben kleinere Software-Unternehmen (APL2000, Dyalog APL, später auch MicroAPL) APL kontinuierlich weiterentwickelt. Mittlerweile haben diese Implementierungen IBMs APL2 in Sachen Leistungsfähigkeit deutlich hinter sich gelassen. Allerdings ist APL2 die einzige APL-Implementierung, die (auch) auf Mainframes läuft.
Die vielleicht derzeit beste Implementierung, Dyalog APL, wurde von Microsoft in den Kreis der anerkannten .NET-Sprachen aufgenommen. IBM APL2 ist dagegen erste Wahl in IBMs Websphere-Welt.
Besondere Bedeutung hat APL2 heute vor allem noch in der Banken-, Versicherungs- und der Tourismusbranche sowie in Forschung und Entwicklung.
Heute wird APL in kleinen Projekten von spezialisierten Software-Unternehmen eingesetzt sowie als Werkzeug von Fachleuten, die sich eher als Systemanalytiker oder Business-Analysten denn als Programmierer bezeichnen. Auch in den Fachabteilungen grĂśĂerer Unternehmen, Forschungsinstituten und an Universitäten wird es noch immer erfolgreich genutzt.
2012 konnte das Computer History Museum mit der Erlaubnis von IBM den Assembler-Quelltext von APL in der 1969â1972 âXM6â Version fĂźr System/360 verĂśffentlichen.cite-ref-10[10]
J und APL
In seinen späten Jahren hat der Hauptdesigner von APL, Ken Iverson, einen zweiten Versuch gewagt. Das Ergebnis ist die Programmiersprache J, die nichts mit Microsofts nicht mehr unterstĂźtzter Programmiersprache J# zu tun hat. Diese Sprache ähnelt in ihren Konzepten sehr stark APL, verwendet aber ausschlieĂlich Zeichen des ASCII-Zeichensatzes. Dies wird von den Anhängern als gewaltiger Fortschritt angesehen, von Kritikern aber abgelehnt, da die Verständlichkeit vermindert und Selbsterklärung der Symbole nicht ausgenutzt werden.
Einzelnachweise
cite-note-11. â Falkoff, A.D., K.E. Iverson, The Design of APL, IBM Journal of Research and Development, Volume 17, Number 4, 1973-07.
cite-note-22. â Iverson K.E.," Notation as a tool of thought (Memento vom 24. August 2012 im Internet Archive) (PDF; 2,2 MB)", Communications of the ACM, 23: 444-465 (August 1980).
cite-note-33. â A. D. Falkoff, K. E. Iverson, E. H. Sussenguth: A formal description of SYSTEM/360. In: IBM Systems Journal. Volume 3, Issue 2 (1964).
cite-note-44. â Die Schreibmaschine hat einen begrenzten Zeichenvorrat. Spezielle Symbole wurden deshalb durch Ăbereinandertippen zweier Zeichen erzeugt. Beispiel: Das Zeichen â wird durch die Folge â [RĂźcktaste] ° erzeugt.
cite-note-55. â Als Beispiel mĂśge ein Video auf YouTube dienen, in dem Schritt fĂźr Schritt zwei einzeilige APL Funktionen entwickelt werden: die erste Funktion berechnet die nächste Generation gemäà den Regeln fĂźr Conways Spiel des Lebens, die zweite Funktion stellt das Spiel dar: Conwayâs Game Of Life in APL
cite-note-66. â One-liner Wars in APL
cite-note-77. â Arlene E. Azzarello: QUOTE-QUAD: The Early Years., APL Press, Palo Alto, 1982-11.
cite-note-88. â Morten Kromberg: APL - Alive and Well! Abgerufen am 3. Mai 2022 (englisch).
cite-note-99. â APL wiki
cite-note-1010. â Len Shustek: The APL Programming Language Source Code. computerhistory.org, 10. Oktober 2012, abgerufen am 15. Oktober 2013 (englisch).
cite-note-1111. â Log-On Software Announces Log-On APL2. Database Trends and Applications, 8. Februar 2021, abgerufen am 24. Oktober 2021 (englisch).
cite-note-1212. â Software withdrawal and support discontinuance. IBM APL2, IBM APL2 Application Environment, and IBM Workstation APL2 for Multiplatforms. In: ibm.com. 26. Januar 2021, abgerufen am 24. Oktober 2021 (englisch).
Literatur
⢠Bernard Legrand: Mastering Dyalog APL. 2009, ISBN 978-0-9564638-0-7.
⢠Kenneth E. Iverson: A Programming Language. Wiley, 1962, ISBN 0-471-43014-5.
⢠James A. Brown, Sandra Pakin, Raymnod P. Polivka: APL2 at a Glance. Prentice Hall, 1988, ISBN 0-13-038670-7.
⢠Hans Lochner: APL2-Handbuch. Springer Verlag, 1989, ISBN 978-3-540-50677-5.
⢠Wulf-Dieter Wagner: Software-Engineering mit APL2. Springer Verlag, 1992, ISBN 3-540-54406-2.
⢠Hanspeter Bieri und Felix Grimm: Datenstrukturen in APL2. Springer Verlag, 1992, ISBN 0-387-55747-4.
⢠Bernhard Legrand: Les APL Êtendus. Masson, Paris 1994.
Weblinks
Commons
: APL (Programmiersprache)
â Sammlung von Bildern, Videos und Audiodateien
Implementierungen
⢠Dyalog APL
⢠APL2000 (ehemals STSC, Manugistics)
⢠IBMs APL2
⢠MicroAPL
⢠J
⢠NARS2000 (Open Source)
⢠GNU APL (Open Source und frei (GPL))
Periodika
⢠Vector â englischsprachige APL-Publikation
⢠APL-Journal â deutschsprachige APL-Publikation
Ăber APL
⢠APL Wiki
⢠APL-Germany e. V. â Deutsche Anwendervereinigung
⢠Ăber APL
⢠Conways Game of life in APL
⢠APL demonstration Professor Bob Spence, Imperial College London, 1975.
⢠The Origins of APL mit Ken Iverson und Adin Falkoff, 1974
Syntax